package com.springcloud.log.modular.log.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.springcloud.commom.api.ResultCode;
import com.springcloud.commom.exception.ServiceException;
import com.springcloud.commom.factory.PageFactory;
import com.springcloud.commom.page.PageResult;
import com.springcloud.log.entity.SysVisLog;
import com.springcloud.log.modular.log.mapper.SysVisLogMapper;
import com.springcloud.log.modular.log.service.SysVisLogService;
import com.springcloud.log.param.SysVisLogParam;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 系统访问日志表service接口实现类
 *
 * @author hzl
 * @date 2024-07-24 15:35:36
 */
@Service
public class SysVisLogServiceImpl extends ServiceImpl<SysVisLogMapper, SysVisLog> implements SysVisLogService {

    @Override
    public PageResult<SysVisLog> page(SysVisLogParam sysVisLogParam) {
        QueryWrapper<SysVisLog> queryWrapper = new QueryWrapper<>();
        if (ObjectUtil.isNotNull(sysVisLogParam)) {

            // 根据名称 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getName())) {
                queryWrapper.lambda().eq(SysVisLog::getName, sysVisLogParam.getName());
            }
            // 根据是否执行成功（Y-是，N-否） 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getSuccess())) {
                queryWrapper.lambda().eq(SysVisLog::getSuccess, sysVisLogParam.getSuccess());
            }
            // 根据具体消息 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getMessage())) {
                queryWrapper.lambda().eq(SysVisLog::getMessage, sysVisLogParam.getMessage());
            }
            // 根据ip 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getIp())) {
                queryWrapper.lambda().eq(SysVisLog::getIp, sysVisLogParam.getIp());
            }
            // 根据地址 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getLocation())) {
                queryWrapper.lambda().eq(SysVisLog::getLocation, sysVisLogParam.getLocation());
            }
            // 根据浏览器 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getBrowser())) {
                queryWrapper.lambda().eq(SysVisLog::getBrowser, sysVisLogParam.getBrowser());
            }
            // 根据操作系统 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getOs())) {
                queryWrapper.lambda().eq(SysVisLog::getOs, sysVisLogParam.getOs());
            }
            // 根据操作类型（字典 1登入 2登出） 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getVisType())) {
                queryWrapper.lambda().eq(SysVisLog::getVisType, sysVisLogParam.getVisType());
            }
            // 根据访问时间 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getVisTime())) {
                queryWrapper.lambda().eq(SysVisLog::getVisTime, sysVisLogParam.getVisTime());
            }
            // 根据访问账号 查询
            if (ObjectUtil.isNotEmpty(sysVisLogParam.getAccount())) {
                queryWrapper.lambda().eq(SysVisLog::getAccount, sysVisLogParam.getAccount());
            }
        }
        return new PageResult<>(this.page(PageFactory.defaultPage(), queryWrapper));
    }

    @Override
    public List<SysVisLog> list(SysVisLogParam sysVisLogParam) {
        return this.list();
    }

    @Override
    public void add(SysVisLogParam sysVisLogParam) {
        SysVisLog sysVisLog = new SysVisLog();
        BeanUtil.copyProperties(sysVisLogParam, sysVisLog);
        this.save(sysVisLog);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(SysVisLogParam sysVisLogParam) {
        this.removeById(sysVisLogParam.getId());
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void edit(SysVisLogParam sysVisLogParam) {
        SysVisLog sysVisLog = this.querySysVisLog(sysVisLogParam);
        BeanUtil.copyProperties(sysVisLogParam, sysVisLog);
        this.updateById(sysVisLog);
    }

    @Override
    public SysVisLog detail(SysVisLogParam sysVisLogParam) {
        return this.querySysVisLog(sysVisLogParam);
    }

    /**
     * 获取系统访问日志表
     *
     * @author hzl
     * @date 2024-07-24 15:35:36
     */
    private SysVisLog querySysVisLog(SysVisLogParam sysVisLogParam) {
        SysVisLog sysVisLog = this.getById(sysVisLogParam.getId());
        if (ObjectUtil.isNull(sysVisLog)) {
            throw new ServiceException(ResultCode.INTERNAL_SERVER_ERROR);
        }
        return sysVisLog;
    }
}
